/**
 * Created with IntelliJ IDEA.
 * Description: 泛型的学习
 */

/*class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class ClassName<T1, T2, Tn> {

}

class 泛型类名称<类型形参列表> extends 继承类*//* 这里可以使用类型参数 *//* {
    // 这里可以使用类型参数
}
class ClassName<T1, T2,  Tn> extends ParentClass<T1> {
    // 可以只使用部分类型参数
}*/

class Alg1{

    public static <T extends Comparable<T>>T comMax(T[] arrays) {
        T max = arrays[0];
        for (int i = 1; i < arrays.length; i++) {
            if(max.compareTo(arrays[i]) < 0) {
                max = arrays[i];
            }
        }
        return max;
    }

}

class Alg<T extends Comparable<T>> {

    public T comMax(T[] arrays) {
        T max = arrays[0];
        for (int i = 1; i < arrays.length; i++) {
            if(max.compareTo(arrays[i]) < 0) {
                max = arrays[i];
            }
        }
        return max;
    }

}

class MyArray<T extends Number>{
    public T[] obj;

    public void add(int pos,T val) {
        obj[pos] = val;
    }

    public T getPos(int pos) {
        return obj[pos];
    }

    public T[] getObj() {
        return obj;
    }



}



public class Test {

    public static void main(String[] args) {
        Integer[] arr = new Integer[]{10,20,30,40};
        //第一种写法，会自动推导类型
        int ret = Alg1.comMax(arr);
        //第二种写法，表明类型
        /*int ret = Alg1.<Integer>comMax(arr);*/
        System.out.println(ret);
    }

    public static void main6(String[] args) {
        Alg<Integer> alg = new Alg<>();
        Integer[] arr = new Integer[]{10,20,30,40};
        int ret = alg.comMax(arr);
        System.out.println(ret);
    }

    public static void main5(String[] args) {
        //正常，因为 Integer 是 Number 的子类型
        MyArray<Integer> arr = new MyArray<>();
        //编译错误，因为 String 不是 Number 的子类型
        /*MyArray<String> arr2 = new MyArray<>();*/
    }

    public static void main4(String[] args) {
        MyArray<Integer> myArray = new MyArray<>();
        myArray.add(0,10);
        myArray.add(1,2);
        myArray.add(2,19);
        Integer[] x = myArray.getObj();
    }

    public static void main3(String[] args) {
        MyArray<Integer> myArray = new MyArray<>();
        myArray.add(0,10);
        myArray.add(1,2);
        /*myArray.add(2,"hello");*/
        int num = myArray.getPos(0);
        System.out.println(num);
    }

    /*public static void main2(String[] args) {
        MyArray myArray = new MyArray();
        myArray.add(0,10);
        myArray.add(1,"你好");
        myArray.add(2,12.3);
        String s = (String)myArray.getPos(1);
        System.out.println(s);
    }*/

    public static void main1(String[] args) {
        Object[] objects = new Object[]{1,2,3,"abc",1.2};
        //数组Object 类是不允许强转的,但是单个类可以
        String[] strings = (String[]) objects;
    }
}
